/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpb.projetoesa.negocio;

import br.ufpb.projetoesa.exceptions.DisciplinaInexistenteException;
import br.ufpb.projetoesa.exceptions.DisciplinaInvalidaException;
import br.ufpb.projetoesa.exceptions.RemocaoDeAlunosImpossivelException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author leonardo
 */
public class Turma implements Serializable{
    
    
    private String id; // Ex.: 2009.2
    private int qtdAlunos;
    private List<Disciplina> disciplinas;

    
    public Turma(String id){
        this(id, 0);
    }
    
    public Turma(String id, int _qtdAlunos){
        this.id = id;
        this.qtdAlunos = _qtdAlunos;
        this.disciplinas = new ArrayList<Disciplina>();
    }
    
    public String getID() {
        return id;
    }

    public void setID(String id) {
        this.id = id;
    }

    public int getQtdAlunos() {
        return qtdAlunos;
    }

    public void setQtdAlunos(int qtdAlunos) {
        this.qtdAlunos = qtdAlunos;
    }
    
    
    /**
     * Adiciona uma nova disciplina nesta turma.
     */
    public void addDisciplina(Disciplina disc){
        if (disc != null)
            this.disciplinas.add(disc);
    }
    
    
    /**
     * Remove uma nova disciplina nesta turma.
     */
    public void removeDisciplina(Disciplina disc) throws DisciplinaInexistenteException{
        if (disciplinas.contains(disc))
            disciplinas.remove(disc);
        else
            throw new DisciplinaInexistenteException("Não foi possível remover a disciplina " + disc.getNome() + ".\n" +
                    " Verifique e tente novamente.");
    }
    
    
    /**
     * Atualiza uma disciplina existente nesta turma.
     */
    public void atualizaDisciplina(Disciplina disc1, Disciplina disc2) throws DisciplinaInexistenteException, 
            DisciplinaInvalidaException{
        if (disciplinas.contains(disc1)) {            
            if (disc2 != null) {
                disciplinas.remove(disc1);
                disciplinas.add(disc2);                
            } else {
                throw new DisciplinaInvalidaException("Ocorreu um erro ao tentar atualizar a disciplina, \n"
                        + " verifique e tente novamente.");
            }
        } else {
            throw new DisciplinaInexistenteException("Não foi possível remover a disciplina " + disc1.getNome() + ".\n" +
                    " Verifique e tente novamente.");
        }
    }
    
    
    
    /**
     * Verifica se a quantidade de alunos a serem removidas é possível,
     * caso não seja, lança uma exceção indicando a violação da regra de
     * negócio.
     */
    public void removerAlunos(int qtd) throws RemocaoDeAlunosImpossivelException{
        if ((this.qtdAlunos - qtd) > 3)
            qtdAlunos -= qtd;
        else
            throw new RemocaoDeAlunosImpossivelException("A quantidade de alunos a serem removidos excede o limite.");
    }
    
    
    public String toString(){        
        return "Id: "+this.id + " Quantidade de Alunos: " + this.qtdAlunos;
    }
    
}
